# 元组推导式

# 语法与列表推导式相同，
# 但是列表推导式返回一个列表，元组推导式返回一个生成器
# (变量运算 for i in 容器) ===> 结果是一个生成器

# 生成器：是一个特殊的迭代器，生成器可以自定义，也可以使用元组推导式去定义
# 生成器按照某正算法去推算下一个数据或结果，只需要往内存中存储-个生成器， 节约内存消耗， 提升性能

'''
语法
    (1) 里面是里面是推导式，外面是一个 () 的结果就是一个生成器
    (2) 自定义生成器，含有yield关键字的函数就是生成器
        含有yield关键字的函数，返回的结果是一个迭代器， 换句话说，生成器函数就是一个返回迭代器的函数
'''

# 列表推导式
varl = [1, 2, 3, 4, 5]
print([i**2 for i in varl])
# [1, 4, 9, 16, 25]

# 元组推导式 生成器 generator
res = (i**2 for i in varl)
print(res)
# <generator object <genexpr> at 0x0000024797CA2730>

'''
生成器是迭代器的一种，所以可以使用迭代器的方法
    next()
    list() tuple()
    for i in generator
'''
# 迭代器对象元素取出之后就没有了，所以要运行下一个迭代器函数，上一个操作迭代器的函数应该注释
# 否则下一个操作迭代器的函数操作的迭代器就不hi是原来完整的迭代器了
# print(next(res))
# 1
# print(list(res))
# [1, 4, 9, 16, 25]
# print(tuple(res))
# [1, 4, 9, 16, 25]

